import { createRouter, createWebHashHistory } from 'vue-router'
import routerMap from './routerMap'
import { useUserStore } from '@/stores/user'
import api from '@/api'

const Router = createRouter({
  history: createWebHashHistory(),
  routes: routerMap,
})

// 全局前置守卫：每次路由跳转前执行
Router.beforeEach(async (to, from, next) => {
  const userStore = useUserStore()  // 获取用户Store实例

  // 重定向到后端登录页面的函数
  const redirectToLogin = () => {
    const BACKEND_URL = import.meta.env.VITE_GO_URL || 'http://localhost:8181'
    console.log('用户未登录，重定向到后端登录页面:', `${BACKEND_URL}/`)
    window.location.href = `${BACKEND_URL}/`
  }

  try {
    // 1. 首先尝试从localStorage恢复用户状态（性能优化）
    const storedTokenInfo = localStorage.getItem('tokenInfo')
    if (storedTokenInfo && storedTokenInfo.trim()) {
      try {
        const cachedTokenInfo = JSON.parse(storedTokenInfo)
        // 临时恢复状态（提升用户体验）
        userStore.setTokenInfo(cachedTokenInfo)
        console.log('从localStorage恢复用户状态:', cachedTokenInfo)
      } catch (error) {
        // localStorage数据格式错误，清除它
        localStorage.removeItem('tokenInfo')
        console.warn('localStorage中的tokenInfo格式错误，已清除:', error)
      }
    }

    // 2. 判断是否需要验证后端（关键逻辑）
    const shouldVerifyBackend = 
      !from.name ||                           // 首次访问（刷新页面）
      !userStore.isLoggedIn ||                // localStorage中无有效登录状态
      !userStore.userId                       // 用户信息不完整

    if (shouldVerifyBackend) {
      console.log('需要验证后端登录状态（原因：', !from.name ? '首次访问/刷新' : '状态不完整', '）')
      
      try {
        // 调用后端接口获取当前登录状态（基于Cookie中的token）
        const res = await api.user.getTokenInfo()
        
        // 解析并设置用户信息
        if (res.data) {
          const tokenInfo = JSON.parse(decodeURIComponent(res.data))
          
          // 检查tokenInfo.isLogin字段，确保用户真正登录
          if (tokenInfo && tokenInfo.isLogin === true) {
            console.log('后端验证成功，用户已登录:', tokenInfo)
            userStore.setTokenInfo(tokenInfo)
          } else {
            // tokenInfo存在但isLogin=false，说明未登录
            console.log('后端返回tokenInfo但用户未登录（isLogin=false）')
            throw new Error('User not logged in (isLogin=false)')
          }
        } else {
          // 数据为空，触发登出流程
          console.log('后端返回空数据，用户未登录')
          throw new Error('Token data is empty')
        }
        
      } catch (error) {
        // 后端验证失败（可能是未登录、token过期、或后端未启动）
        console.log('后端验证失败，原因:', error.message)
        userStore.logout()
        redirectToLogin()
        return // 重要：阻止路由继续执行
      }
    } else {
      // 同一会话内的路由跳转，信任localStorage缓存（性能优化）
      console.log('使用缓存的登录状态（同一会话内路由跳转）')
    }

    // 3. 最终检查：确保用户已登录
    if (!userStore.isLoggedIn) {
      console.log('最终检查失败：用户未登录，重定向到登录页面')
      userStore.logout()
      redirectToLogin()
      return // 重要：阻止路由继续执行
    }

    console.log('用户已登录，允许访问页面:', to.path)
    
    // 4. 设置页面标题
    if (to.meta && to.meta.title) {
      document.title = `${to.meta.title} - Demo System`
    } else {
      document.title = 'Demo System'
    }
    
    next()

  } catch (error) {
    // 路由守卫执行失败
    console.error('路由守卫执行失败:', error)
    userStore.logout()
    redirectToLogin()
    return // 重要：阻止路由继续执行
  }
})

export default Router
